home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / QuickTime / Programming Stuff / QuickTime 2.1 for Developers / Sprite Sample Code / AddReferenceTrack.c next >
Encoding:
C/C++ Source or Header  |  1995-07-24  |  3.5 KB  |  122 lines  |  [TEXT/MMCC]

  1. /* 
  2.     AddReferenceTrack.c
  3.     
  4.     This sample code shows how a movie can be modified to use a reference track
  5.     as the image data for an image index in a sprite track.
  6.     
  7.     It prompts for a movie which should contain a single sprite track, and then
  8.     add's a movie named "Add Me" as a reference track. The reference track
  9.     will override the image data for a selected image index.
  10.     
  11.     You may use the movie created with the MakeSpriteMovie sample code. The 
  12.     QuickTime icon's image index will be replaced by the "Add Me" movie.
  13.     
  14.     Note that the movie with the sprite track is permanently modified, so use
  15.     a copy if you want to retain the original.
  16. */
  17.  
  18. #include <Fonts.h>
  19. #include <Movies.h>
  20.  
  21. #define    kImageIndexToOverride    1
  22.  
  23. void main( void )
  24. {
  25.     OSErr                 err;
  26.     short                 movieResID = 0, resFref, resID = 0, resRefNum;
  27.     StandardFileReply     reply;
  28.     SFTypeList             types;
  29.     Movie                 m;
  30.     Boolean             done = false;
  31.     TimeValue             time = 0, oldDuration;
  32.     FSSpec                fss;
  33.     Movie                movieB;
  34.     long                 i, origTrackCount, referenceIndex, imageIndexToOverride;
  35.     Track                 newTrack, spriteTrack;
  36.     QTAtomContainer        inputMap;
  37.     QTAtom                inputAtom;
  38.     OSType                inputType;
  39.     Media                spriteMedia;
  40.     
  41.     InitGraf( &qd.thePort );
  42.     InitFonts();
  43.     InitWindows();
  44.     InitMenus();
  45.     TEInit();
  46.     InitDialogs( 0L );
  47.     InitCursor();
  48.     MaxApplZone();
  49.  
  50.     EnterMovies();
  51.  
  52.     // prompt for a movie containing a sprite track and load it
  53.     types[0] = MovieFileType;
  54.     StandardGetFilePreview( nil, 1, types, &reply );
  55.     if ( !reply.sfGood ) return;
  56.  
  57.     err = OpenMovieFile( &reply.sfFile, &resFref, fsRdPerm );
  58.     if ( err ) return;
  59.  
  60.     err = NewMovieFromFile( &m, resFref, &movieResID, (StringPtr)nil, newMovieActive, nil );
  61.     if ( err ) return;
  62.  
  63.     CloseMovieFile( resFref );
  64.  
  65.     // add a reference track
  66.     origTrackCount = GetMovieTrackCount( m );
  67.     FSMakeFSSpec( reply.sfFile.vRefNum, reply.sfFile.parID, "\pAdd Me", &fss );
  68.  
  69.     err = OpenMovieFile( &fss, &resFref, fsRdPerm );
  70.     if ( err ) return;
  71.  
  72.     err = NewMovieFromFile( &movieB, resFref, &resID, (StringPtr)nil, 0, nil );
  73.     if ( err ) return;
  74.  
  75.     CloseMovieFile( resFref );
  76.     spriteTrack = GetMovieIndTrack( m, 1 );
  77.  
  78.     SetMovieSelection( m, 0 ,0 );
  79.  
  80.     for ( i = 1; i <= GetMovieTrackCount( movieB ); i++ ) {
  81.         Track     t = GetMovieIndTrack( movieB, i );
  82.         OSType     aType;
  83.  
  84.         GetMediaHandlerDescription( GetTrackMedia(t), &aType, nil, nil );
  85.         if ( aType != VideoMediaType ) {
  86.             DisposeMovieTrack( t );
  87.             i--;
  88.         }
  89.     }
  90.  
  91.     oldDuration = GetMovieDuration( m );
  92.     AddMovieSelection( m, movieB );
  93.     DisposeMovie( movieB );
  94.  
  95.     DeleteMovieSegment( m, oldDuration, GetMovieDuration( m ) - oldDuration );
  96.  
  97.     newTrack = GetMovieIndTrack( m, origTrackCount + 1 );
  98.     AddTrackReference( spriteTrack, newTrack, kTrackModifierReference, &referenceIndex );
  99.  
  100.     // create and add the input map
  101.     spriteMedia = GetTrackMedia( spriteTrack );
  102.     GetMediaInputMap( spriteMedia, &inputMap );
  103.     QTInsertChild( inputMap, kParentAtomIsContainer, kTrackModifierInput, referenceIndex,
  104.                   0, 0, nil, &inputAtom );
  105.                   
  106.     inputType = kTrackModifierTypeSpriteImage;
  107.     QTInsertChild( inputMap, inputAtom, kTrackModifierType, 1, 0, 
  108.                    sizeof(inputType), &inputType, nil );
  109.                    
  110.     imageIndexToOverride = kImageIndexToOverride;
  111.     QTInsertChild( inputMap, inputAtom, kSpritePropertyImageIndex, 1, 0, 
  112.                    sizeof(imageIndexToOverride), &imageIndexToOverride, nil );
  113.     
  114.     SetMediaInputMap( spriteMedia, inputMap );
  115.     QTDisposeAtomContainer( inputMap );
  116.     
  117.     // save changes to movie
  118.     OpenMovieFile( &reply.sfFile, &resRefNum, fsRdWrPerm );
  119.     UpdateMovieResource( m, resRefNum, movieResID, nil );
  120.      CloseMovieFile ( resRefNum );
  121. }
  122.